﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Cliente.BusinessLogic
{
    /// <summary>
    /// BusinessLogic Class - DicionarioErroExportacaoComitente
    /// </summary>
    public class DicionarioErroExportacaoComitente : BaseBusinessLogic
    {
        #region Variáveis Privadas

        private ResourceAccess.DicionarioErroExportacaoComitente _dicionarioErroExportacaoComitente;

        #endregion

        #region Construtor

        public DicionarioErroExportacaoComitente()
            : base()
        {
            _dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
        }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Altera a descrição de um erro de exportação de comitente.
        /// </summary>
        /// <param name="request">Valores para alteracao</param>
        public void AlterarErroExportacaoComitente(BusinessEntity.ErroExportacaoComitente request)
        {
            // Validando objeto request
            if (request == null)
                throw new BusinessException(109352);
            else
            {
                // Validacao de RuleSet
                SinacorValidation validation = new SinacorValidation();
                validation.Validate<BusinessEntity.ErroExportacaoComitente>(request, "Alteracao");

                BusinessEntity.Parameter.FiltroErroExportacaoComitente filtroErroExportacaoComitente = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroErroExportacaoComitente();
                filtroErroExportacaoComitente.Descricao = request.Descricao;

                List<BusinessEntity.ErroExportacaoComitente> response = new List<Sinacor.Servico.Bovespa.Cliente.BusinessEntity.ErroExportacaoComitente>();

                response = this.ConsultarErrosExportacoesComitentes(filtroErroExportacaoComitente);

                // Validando existencia de erro com a descricao informada 
                if (response == null || response.Count != 0)
                    throw new BusinessException(109356);
                else
                {
                    ResourceAccess.DicionarioErroExportacaoComitente dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
                    dicionarioErroExportacaoComitente.AlterarErroExportacaoComitente(request);
                }
            }
        }

        /// <summary>
        /// Altera a descrição de diversos erros de exportação de comitente.
        /// </summary>
        /// <param name="request">Lista de valores para alteracao</param>
        public void AlterarErrosExportacoesComitentes(List<BusinessEntity.ErroExportacaoComitente> request)
        {
            foreach (BusinessEntity.ErroExportacaoComitente item in request)
                this.AlterarErroExportacaoComitente(item);
        }

        /// <summary>
        /// Realiza a pesquisa no dicionário de erros de exportação de comitente, conforme dados informados no filtro.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<BusinessEntity.ErroExportacaoComitente> ConsultarErrosExportacoesComitentes(BusinessEntity.Parameter.FiltroErroExportacaoComitente request)
        {
            // Validando objeto request
            if (request == null)
                throw new BusinessException(109352);
            else
            {
                ResourceAccess.DicionarioErroExportacaoComitente dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
                return dicionarioErroExportacaoComitente.ConsultarErrosExportacoesComitentes(request);
            }
        }

        /// <summary>
        /// Exclui um erro de exportação de comitente.
        /// </summary>
        /// <param name="request"></param>
        public void ExcluirErroExportacaoComitente(BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave request)
        {
            // Validando objeto request
            if (request == null)
                throw new BusinessException(109352);
            else
            {
                ResourceAccess.DicionarioErroExportacaoComitente dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
                dicionarioErroExportacaoComitente.ExcluirErroExportacaoComitente(request);
            }
        }

        /// <summary>
        /// Exclui diversos erros de exportação de comitente.
        /// </summary>
        /// <param name="request"></param>
        public void ExcluirErrosExportacoesComitentes(List<BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave> request)
        {
            foreach (BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave item in request)
                this.ExcluirErroExportacaoComitente(item);
        }

        /// <summary>
        /// Inclui diversos erros de exportação de comitente.
        /// Exclui diversos erros de exportação de comitente.
        /// Altera a descrição de diversos erros de exportação de comitente.
        /// </summary>
        /// <param name="listaExclusao"></param>
        /// <param name="listaInclusao"></param>
        /// <param name="listaAlteracao"></param>
        public void ExecutarTransacoes(List<BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave> listaExclusao, List<BusinessEntity.ErroExportacaoComitente> listaInclusao, List<BusinessEntity.ErroExportacaoComitente> listaAlteracao)
        {
            foreach (BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave item in listaExclusao)
                this.ExcluirErroExportacaoComitente(item);

            foreach (BusinessEntity.ErroExportacaoComitente item in listaInclusao)
                this.IncluirErroExportacaoComitente(item);

            foreach (BusinessEntity.ErroExportacaoComitente item in listaAlteracao)
                this.AlterarErroExportacaoComitente(item);
        }

        /// <summary>
        /// Inclui um erro de exportação de comitente.
        /// </summary>
        /// <param name="request"></param>
        public void IncluirErroExportacaoComitente(BusinessEntity.ErroExportacaoComitente request)
        {
            BusinessEntity.Parameter.FiltroErroExportacaoComitente filtroErroExportacaoComitente;
            List<BusinessEntity.ErroExportacaoComitente> response;

            // Validando objeto request
            if (request == null)
                throw new BusinessException(109352);
            else
            {
                // Validacao de RuleSet
                SinacorValidation validation = new SinacorValidation();
                validation.Validate<BusinessEntity.ErroExportacaoComitente>(request);

                filtroErroExportacaoComitente = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroErroExportacaoComitente();
                filtroErroExportacaoComitente.Codigo = request.Codigo;

                response = new List<Sinacor.Servico.Bovespa.Cliente.BusinessEntity.ErroExportacaoComitente>();

                response = this.ConsultarErrosExportacoesComitentes(filtroErroExportacaoComitente);

                // Validando existencia de erro com o codigo informado
                if (response == null || response.Count != 0)
                    throw new BusinessException(109355);
                else
                {
                    filtroErroExportacaoComitente = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.Parameter.FiltroErroExportacaoComitente();
                    filtroErroExportacaoComitente.Descricao = request.Descricao;

                    response = new List<Sinacor.Servico.Bovespa.Cliente.BusinessEntity.ErroExportacaoComitente>();

                    response = this.ConsultarErrosExportacoesComitentes(filtroErroExportacaoComitente);

                    // Validando existencia de erro com a descricao informada 
                    if (response == null || response.Count != 0)
                        throw new BusinessException(109356);
                    else
                    {
                        ResourceAccess.DicionarioErroExportacaoComitente dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
                        dicionarioErroExportacaoComitente.IncluirErroExportacaoComitente(request);
                    }
                }
            }
        }

        /// <summary>
        /// Inclui diversos erros de exportação de comitente.
        /// </summary>
        /// <param name="request"></param>
        public void IncluirErrosExportacoesComitentes(List<BusinessEntity.ErroExportacaoComitente> request)
        {
            foreach (BusinessEntity.ErroExportacaoComitente item in request)
                this.IncluirErroExportacaoComitente(item);
        }

        /// <summary>
        /// Obtém um determinado erro de exportação de comitente
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.ErroExportacaoComitente ObterErroExportacaoComitente(BusinessEntity.Parameter.FiltroErroExportacaoComitenteChave request)
        {
            // Validando objeto request
            if (request == null)
                throw new BusinessException(109352);
            else
            {
                ResourceAccess.DicionarioErroExportacaoComitente dicionarioErroExportacaoComitente = new ResourceAccess.DicionarioErroExportacaoComitente();
                BusinessEntity.ErroExportacaoComitente response = new Sinacor.Servico.Bovespa.Cliente.BusinessEntity.ErroExportacaoComitente();
                response = dicionarioErroExportacaoComitente.ObterErroExportacaoComitente(request);
                return response;
            }
        }

        #endregion
    }
}
